package com.mall.framework.util;

import com.mall.common.utils.StringUtils;
import com.mall.common.utils.bean.BeanUtils;
import com.mall.framework.shiro.realm.UserRealm;
import com.mall.system.domain.entity.SysUser;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject;

/**
 * shiro 工具类
 * Created by zhonglin on 2020/4/8.
 */
public class ShiroUtils {

  public static Subject getSubject() {

    return SecurityUtils.getSubject();
  }

  public static Session getSession() {

    return SecurityUtils.getSubject()
                        .getSession();
  }

  public static void logout() {

    getSubject().logout();
  }

  public static SysUser getSysUser() {

    SysUser user = null;
    Object  obj  = getSubject().getPrincipal();
    if (StringUtils.isNotNull(obj)) {
      user = new SysUser();
      BeanUtils.copyBeanProp(user, obj);
    }
    return user;
  }

  public static void setSysUser(SysUser user) {

    Subject             subject                = getSubject();
    PrincipalCollection principalCollection    = subject.getPrincipals();
    String              realmName              = principalCollection.getRealmNames()
                                                                    .iterator()
                                                                    .next();
    PrincipalCollection newPrincipalCollection = new SimplePrincipalCollection(user, realmName);
    // 重新加载Principal
    subject.runAs(newPrincipalCollection);
  }

  public static void clearCachedAuthorizationInfo() {

    RealmSecurityManager rsm   = (RealmSecurityManager) SecurityUtils.getSecurityManager();
    UserRealm            realm = (UserRealm) rsm.getRealms()
                                                .iterator()
                                                .next();
    realm.clearCachedAuthorizationInfo();
  }

  public static Long getUserId() {

    return getSysUser().getUserId()
                       .longValue();
  }

  public static String getLoginName() {

    return getSysUser().getLoginName();
  }

  public static String getIp() {

    return getSubject().getSession()
                       .getHost();
  }

  public static String getSessionId() {

    return String.valueOf(getSubject().getSession()
                                      .getId());
  }

  /**
   * 生成随机盐
   */
  public static String randomSalt() {
    // 一个Byte占两个字节，此处生成的3字节，字符串长度为6
    SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator();
    String                      hex          = secureRandom.nextBytes(3)
                                                           .toHex();
    return hex;
  }

}
